home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGBLER / ASMCODE2.LZH / DISP-REG.ASM < prev    next >
Assembly Source File  |  1984-03-04  |  9KB  |  327 lines

  1.     PAGE    ,132
  2.     TITLE    DISPREGS - DISPLAY REGISTERS AS SET BY LOADER
  3.     NAME    DISPREGS
  4. ;****************************************************************
  5. ;* MODULE NAME = DISPREGS
  6. ;*
  7. ;* COPYRIGHT(C) 1984    SKIP GILBRECH
  8. ;*            90 LEXINGTON AVE. #10-G
  9. ;*            NEW YORK, NY 10016
  10. ;*            212-685-0551
  11. ;*
  12. ;* AUTHOR = SKIP GILBRECH
  13. ;* DATE WRITTEN = 01/13/84
  14. ;*
  15. ;* ENVIRONMENT:
  16. ;*  SYSTEM = IBM PC (DOS 2.0 - SHOULD WORK ON ANY VERSION)
  17. ;*  PROCESSOR = MICROSOFT 8086 MACRO ASSEMBLER
  18. ;*
  19. ;* THIS PROGRAM MAY BE FREELY COPIED/ALTERED FOR ANY NON-COMMERCIAL
  20. ;* PURPOSE BUT MAY NOT BE SOLD OR USED IN ANY WAY AS PART OF ANY
  21. ;* PROFIT-MAKING VENTURE WITHOUT PERMISSION OF THE AUTHOR.
  22. ;* (I.E., IN THE UNLIKELY EVENT THAT ANY MONEY IS MADE OFF THIS,
  23. ;* I WANT SOME OF IT...)
  24. ;*
  25. ;* THIS LITTLE PROGRAM WAS INSPIRED BY SOME OF THE RECENT DISCUSSION
  26. ;* ON THE SIG CONCERNING STARTING CONDITIONS (I.E. REGISTER & FLAG
  27. ;* SETTINGS) ENCOUNTERED BY FILES LOADED UNDER DEBUG VERSUS THOSE
  28. ;* ENCOUNTERED BY FILES LOADED BY COMMAND.COM.    IT WAS NOTED THAT
  29. ;* CERTAIN PROGRAMS WORKED UNDER ONE BUT NOT UNDER THE OTHER, AND I
  30. ;* REALIZED THAT I HAD ALWAYS ASSUMED THINGS WERE THE SAME EITHER WAY...
  31. ;*
  32. ;* IT SEEMS, HOWEVER, THAT ALTHOUGH THE DIFFERENCES AREN'T GREAT, THEY
  33. ;* DO EXIST.  IT IS, OF COURSE, FOOLISH TO RELY ON REGISTER AND FLAG
  34. ;* SETTINGS MADE BY SOMEONE ELSE, BUT THAT DOESN'T MEAN IT ISN'T DONE.
  35. ;*
  36. ;* THE ONLY ASSUMPTIONS MADE ABOUT REGISTER SETTINGS IN THIS PROGRAM
  37. ;* ARE THAT:
  38. ;*
  39. ;*   -- CS:IP POINTS TO THE BEGINNING OF THE CODE (HARD TO AVOID
  40. ;*    THAT ASSUMPTION...)
  41. ;*   -- DS:0 CONTAINS AN INT 21H INSTRUCTION (WILL RUN FINE WITHOUT
  42. ;*    IT, BUT WILL HAVE TROUBLE EXITING...)
  43. ;*
  44. ;* BY THE WAY, THIS CAN BE MADE INTO A .COM OR .EXE FILE BY CHANGING
  45. ;* THE EQUATE BELOW.  IT WAS NECESSARY TO MAKE TWO VERSIONS AS THE
  46. ;* TWO TYPES OF FILES ARE LOADED DIFFERENTLY.  TO MAKE A .COM FILE,
  47. ;* USE EXE2BIN AFTER YOU GET THE OBNOXIOUS 'NO STACK SEGMENT' WARNING
  48. ;* FROM LINK.  OF COURSE, THE .EXE REGISTER SETTINGS FOR CS,IP,SS AND
  49. ;* SP ARE PECULIAR TO THIS FILE, AS THEY ARE DEFINED BY THE LINKER AND
  50. ;* PASSED TO DOS IN THE .EXE HEADER.
  51. ;*
  52. ;****************************************************************
  53.     PAGE
  54. ;****************************************************************
  55. ;*
  56. ;*    CONSTANTS
  57. ;*
  58. ;****************************************************************
  59.  
  60. FALSE        EQU    0
  61. TRUE        EQU    NOT FALSE
  62.  
  63. MAKE_COM    EQU    TRUE        ; IF TRUE, MAKE .COM FILE
  64.  
  65. IF NOT MAKE_COM             ; ELSE MAKE .EXE FILE
  66. MAKE_EXE    EQU    TRUE
  67. ELSE
  68. MAKE_EXE    EQU    FALSE
  69. ENDIF
  70.  
  71. LF    EQU    10            ; LINE FEED
  72. CR    EQU    13            ; CARRIAGE RETURN
  73.  
  74. DOSINT        EQU    21H        ; INT. NUMBER FOR DOS FUNCTIONS
  75. PRINT_STRING    EQU    9        ; DOS PRINT STRING FUNCTION
  76.  
  77. ;****************************************************************
  78. ;*
  79. ;*    MACRO
  80. ;*
  81. ;****************************************************************
  82.  
  83. MSG_MAC MACRO    TEXT,FORMAT_ROUTINE
  84.     MOV    DX,OFFSET TEXT
  85.     MOV    AH,PRINT_STRING
  86.     INT    DOSINT
  87.     POP    AX
  88.     CALL    FORMAT_ROUTINE
  89.     ENDM
  90.  
  91. ;****************************************************************
  92. ;*
  93. ;*    STACK SEGMENT IF MAKING .EXE FILE
  94. ;*
  95. ;****************************************************************
  96.  
  97. IF MAKE_EXE
  98. STACK    SEGMENT STACK
  99. DW    128 DUP (?)
  100. STACK    ENDS
  101. ENDIF
  102.  
  103.     PAGE
  104. ;****************************************************************
  105. ;*
  106. ;*    CODE (AND DATA) SEGMENT
  107. ;*
  108. ;****************************************************************
  109.  
  110. CODE    SEGMENT
  111.     ASSUME    CS:CODE,DS:NOTHING,ES:NOTHING,SS:NOTHING
  112.  
  113. IF MAKE_COM
  114.     ORG    100H        ; FOR COM FILE
  115. ENDIF
  116.  
  117. REG_DISP PROC FAR        ; SET UP FOR FAR RETURN TO DOS
  118.  
  119.     JMP    MAINLINE    ; JUMP TO PROGRAM CODE
  120.  
  121. ; STRINGS FOR FORMATTING THE REGISTER DISPLAY:
  122.  
  123. MSG_CS        DB    CR,LF,'CS ==>$'
  124. MSG_DS        DB    '  DS ==>$'
  125. MSG_ES        DB    '  ES ==>$'
  126. MSG_SS        DB    '  SS ==>$'
  127. MSG_AX        DB    CR,LF,'AX ==>$'
  128. MSG_BX        DB    '  BX ==>$'
  129. MSG_CX        DB    '  CX ==>$'
  130. MSG_DX        DB    '  DX ==>$'
  131. MSG_SI        DB    CR,LF,'SI ==>$'
  132. MSG_DI        DB    '  DI ==>$'
  133. MSG_BP        DB    '  BP ==>$'
  134. MSG_SP        DB    '  SP ==>$'
  135. MSG_IP        DB    CR,LF,'IP ==>$'
  136.  
  137. ; BUFFERS FOR OUTPUTTING DIGITS AND PRINTING FLAG SETTINGS:
  138.  
  139. DIGIT_BUF    DB    '      $'
  140. MSG_FLAGS    DB    CR,LF,'FLAGS ==>  - - - - O D I T S Z - A - P - C'
  141.         DB    CR,LF,'           $'
  142. FLAGBUF     DB    '                               ',CR,LF,'$'
  143.  
  144. SAVE_DS     DW    ?
  145. SAVE_ES     DW    ?
  146. SAVE_SS     DW    ?
  147. SAVE_SP     DW    ?
  148. SAVE_AX     DW    ?
  149. SAVE_FL     DW    ?
  150.  
  151.     PAGE
  152. ;****************************************************************
  153. ;*
  154. ;*    REG_DISP MAINLINE
  155. ;*
  156. ;****************************************************************
  157.  
  158. MAINLINE    LABEL NEAR
  159.  
  160.     MOV    CS:SAVE_DS,DS        ; SAVE DS & ES
  161.     MOV    CS:SAVE_ES,ES        ;
  162.     MOV    CS:SAVE_SS,SS        ; SAVE SS:SP SO WE CAN GET
  163.     MOV    CS:SAVE_SP,SP        ;  VALUE OF FLAGS
  164.     MOV    CS:SAVE_AX,AX        ; SAVE AX BEFORE USING
  165.  
  166. ; EARLY 8088'S MIGHT BOMB HERE IF INTERRUPTS AREN'T DISABLED, BUT I CAN'T
  167. ; THINK OF ANY WAY TO SAVE THE INITIAL FLAG SETTINGS WITHOUT USING THE
  168. ; STACK, AND I'M NOT ASSUMING THE STACK IS VALID, SO....
  169.  
  170.     MOV    AX,CS            ; SET SS TO CS
  171.     MOV    SS,AX            ;
  172.     MOV    SP,OFFSET SHORT_STACK    ; WE CAN NOW USE THE STACK
  173.  
  174.     PUSHF                ; SAVE FLAGS BEFORE WE CHANGE THEM
  175.     POP    CS:SAVE_FL        ;
  176.  
  177. ; SET UP FOR FAR RETURN TO DOS:
  178.  
  179.     PUSH    DS            ; PTR TO PSP (EITHER .COM OR .EXE)
  180.     SUB    AX,AX            ; OFFSET 0
  181.     PUSH    AX            ; PUSH IT
  182.  
  183.     MOV    AX,CS            ; SET DS & ES TO CS FOR ADDRESSING DATA
  184.     MOV    DS,AX            ;
  185.     MOV    ES,AX            ;
  186.  
  187.     ASSUME DS:CODE,ES:CODE        ; TELL MASM
  188.  
  189. ; SAVE ALL ORIGINAL REGISTER VALUES ON THE STACK
  190.  
  191.     PUSH    SAVE_FL         ;
  192.     MOV    AX,OFFSET REG_DISP    ; STARTING VALUE OF IP -- IF THIS WAS
  193.     PUSH    AX            ; WRONG, WE'LL NEVER GET HERE
  194.     PUSH    SAVE_SP         ;
  195.     PUSH    BP            ; (NOT CHANGED)
  196.     PUSH    DI            ; (NOT CHANGED)
  197.     PUSH    SI            ; (NOT CHANGED)
  198.     PUSH    DX            ; (NOT CHANGED)
  199.     PUSH    CX            ; (NOT CHANGED)
  200.     PUSH    BX            ; (NOT CHANGED)
  201.     PUSH    SAVE_AX         ;
  202.     PUSH    SAVE_SS         ;
  203.     PUSH    SAVE_ES         ;
  204.     PUSH    SAVE_DS         ;
  205.     PUSH    CS            ; (NOT CHANGED)
  206.  
  207. ; NOW DISPLAY EVERYTHING
  208.  
  209.     MSG_MAC     MSG_CS, HEXDIG_OUT
  210.     MSG_MAC     MSG_DS, HEXDIG_OUT
  211.     MSG_MAC     MSG_ES, HEXDIG_OUT
  212.     MSG_MAC     MSG_SS, HEXDIG_OUT
  213.     MSG_MAC     MSG_AX, HEXDIG_OUT
  214.     MSG_MAC     MSG_BX, HEXDIG_OUT
  215.     MSG_MAC     MSG_CX, HEXDIG_OUT
  216.     MSG_MAC     MSG_DX, HEXDIG_OUT
  217.     MSG_MAC     MSG_SI, HEXDIG_OUT
  218.     MSG_MAC     MSG_DI, HEXDIG_OUT
  219.     MSG_MAC     MSG_BP, HEXDIG_OUT
  220.     MSG_MAC     MSG_SP, HEXDIG_OUT
  221.     MSG_MAC     MSG_IP, HEXDIG_OUT
  222.     MSG_MAC     MSG_FLAGS, PRT_FLAGS
  223.  
  224.     RET        ; FAR RETURN TO OFFSET 0 IN PSP
  225.  
  226. REG_DISP    ENDP
  227.  
  228.     PAGE
  229. ;****************************************************************
  230. ;*
  231. ;*    HEXDIG_OUT    OUTPUT VALUE IN AX IN HEX TO CONSOLE
  232. ;*
  233. ;****************************************************************
  234.  
  235. HEXDIG_OUT    PROC    NEAR
  236.  
  237.     PUSH    AX
  238.     PUSH    DX
  239.     PUSH    DI
  240.  
  241.     MOV    DI,OFFSET DIGIT_BUF    ; STRING BUFFER ADDRESS
  242.     PUSH    DI            ; SAVE FOR LATER
  243.     ADD    DI,5            ; POINT TO LAST DIGIT
  244.     STD                ; SET FOR AUTO DECREMENT
  245.     PUSH    AX            ; SAVE VALUE IN AH
  246.     CALL    HEXDIG_OUT0        ; STORE TWO LEAST SIGNIFICANT DIGITS
  247.     POP    AX            ; RESTORE VALUE IN AH
  248.     MOV    AL,AH            ; GET TWO MOST SIG. DIGITS
  249.     CALL    HEXDIG_OUT0        ; STORE THEM
  250.     POP    DX            ; PT DX TO BEGINNING OF STRING
  251.     MOV    AH,PRINT_STRING     ; DOS FUNCTION NUMBER
  252.     INT    DOSINT            ;
  253.  
  254.     POP    DI
  255.     POP    DX
  256.     POP    AX
  257.     RET
  258.  
  259. HEXDIG_OUT0:
  260.     PUSH    AX            ; SAVE AL FOR OTHER HALF OF DIGIT
  261.     AND    AL,0FH            ; STRIP OFF HIGH DIGIT
  262.     CALL    HEXDIG_OUT1        ; STORE LOWER DIGIT
  263.     POP    AX            ; GET AL BACK FOR HIGH DIGIT
  264.     SHR    AL,1            ; SHIFT INTO LOWER DIGIT
  265.     SHR    AL,1            ;
  266.     SHR    AL,1            ;
  267.     SHR    AL,1            ;
  268.                     ; THEN STORE LOWER DIGIT
  269. HEXDIG_OUT1:
  270.     OR    AL,30H            ; CONVERT 0-9 TO ASCII
  271.     CMP    AL,3AH            ;
  272.     JB    HEXDIG_OUT2        ;
  273.     ADD    AL,7            ; CONVERT 10-15 TO A-F
  274.  
  275. HEXDIG_OUT2:
  276.     STOSB                ; STORE DIGIT IN BUFFER & PT TO NEXT
  277.     RET                ; MOST SIGNIFICANT DIGIT
  278.  
  279. HEXDIG_OUT    ENDP
  280.  
  281.     PAGE
  282. ;****************************************************************
  283. ;*
  284. ;*    PRT_FLAGS    PRINT FLAG SETTINGS (IN AX) AS 1 OR 0
  285. ;*
  286. ;****************************************************************
  287.  
  288. PRT_FLAGS    PROC NEAR
  289.  
  290.     PUSH    AX
  291.     PUSH    CX
  292.     PUSH    DX
  293.     PUSH    DI
  294.     MOV    DX,AX            ; SAVE FLAG SETTINGS IN DX
  295.     MOV    CX,16            ; REPEAT FOR EACH BIT
  296.     MOV    DI,OFFSET FLAGBUF    ; SET DI TO BUFFER FOR FLAGS
  297.     PUSH    DI            ; SAVE FOR DOS CALL
  298.     CLD                ; AUTO-INCREMENT
  299. PF_LOOP:
  300.     ROL    DX,1            ; GET FLAG BIT IN BIT 0
  301.     MOV    AL,DL            ; MOVE BIT TO AL
  302.     AND    AL,1            ; ISOLATE IT
  303.     ADD    AL,'0'                  ; MAKE ASCII
  304.     STOSB                ; STORE CHAR. IN BUF, BUMP PTR
  305.     INC    DI            ; BUMP AGAIN PAST SPACE
  306.     LOOP    PF_LOOP         ; REPEAT WHILE BITS REMAIN
  307.  
  308.     POP    DX            ; RESTORE ADDRESS OF BUFFER
  309.     MOV    AH,PRINT_STRING     ;
  310.     INT    DOSINT            ;
  311.  
  312.     POP    DI
  313.     POP    DX
  314.     POP    CX
  315.     POP    AX
  316.     RET
  317.  
  318. PRT_FLAGS    ENDP
  319.  
  320.     EVEN        ; PUT STACK ON WORD BOUNDARY
  321.  
  322. SHORT_STACK    EQU    $ + 100H
  323.  
  324. CODE    ENDS
  325.  
  326. END    REG_DISP
  327.